package com.radon.config;

import com.radon.util.Constant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 *  DirectExchange消息队列配置
 */
@Configuration
public class DirectExchangeQueueConfig {

    /**
     * 配置路由交换对象实例
     * @return
     */
    @Bean
    public DirectExchange directExchange()
    {
        /**
         * (String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
         * name：名称
         * durable：是否持久化，RabbitMQ关闭后，没有持久化的Exchange将被清除
         * autoDelete：是否自动删除，如果没有与之绑定的Queue，直接删除
         * arguments：结构化参数
         */
        return new DirectExchange(Constant.ExchangeEnum.DIRECT_EXCHANGE.getValue());
    }

    /**
     * 配置队列对象实例
     * 并设置持久化队列
     * @return
     */
    @Bean
    public Queue directQueue()
    {
        // 构造一个新的队列，给出一个名称、耐久性标志、排他和自动删除标志和参数；
        //construct a new queue,given a name,durability flag, exclusive and auto-delete flag,and arguments;
        // 队列名字
        //name;
        // 如果声明一个持久队列（该队列将在服务器重新启动后继续存在），则为true；
        //true if we are declaring a durable queue(the queue will survive a server restart) ; 
        // 如果我们声明一个排他队列（该队列将仅由声明者的连接使用），则为true；
        // true if we are  declaring an exclusive queue(the queue will only be used by the declarer`s connection);
        // 如果服务器不再使用时应删除队列，则为true；
        //true if the server should delete the queue  when it is no longer in use; 
        // 用于声明队列的参数；
        //the argument used to declare hthe queue;


        return new Queue(Constant.QueueEnum.DIRECT_QUEUE.getName(),true);
    }

    /**
     * 将用户注册队列绑定到路由交换配置上并设置指定路由键进行转发
     * @return
     */
    @Bean
    public Binding directBinding()
    {
        return BindingBuilder.bind(directQueue()).to(directExchange()).with(Constant.QueueEnum.DIRECT_QUEUE.getRoutingKey());
    }

}
